آموزش کامل آرایه ها در سی شارپ - جلسه دوم - کلیک سایت
قسمت دوم
همانطور که در قسمت قبلی گفته شد آرایه در سی شارپ در طبقه بندی نوع ، از نوع مرجع ( reference ) به شمار می رود و برای نگهداری چندین متغیر با مقادیر متفاوت اما نوع یکسان استفاده می شود. همچنین با ایجاد کردن یک نمونه آرایه در سی شارپ و روش های متفاوت مقدار دهی و دسترسی به مقادیر آن آشنا شدیم. به علاوه در مورد خطا های متداولی که با آن ممکن است برخورد شود نیز صحبت کردیم. در این قسمت سعی داریم تا در مورد مطالب کامل تری صحبت کنیم .
کپی کردن مقادیر آرایه در سی شارپ
از انجا که ارایه در سی شارپ از نوع مرجع می باشد زمانی که یک متغیر از نوع آرایه به متغیر ارایه دیگری انتساب داده می شود در واقع ادرس مقادیری که متغیر اول به آن اشاره می کند در درون متغیر جدید کپی می شود و در نتیجه ان، از ان پس هر دو متغیر ارایه در سی شارپ به یک مکان اشاره می کنند و تغییر در مقادیر توسط هر کدام باعث تغبیر در دیگری می شود .
مثال : کپی کردن دو ارایه با انتساب دو متغیر از نوع ارایه
static void Main(string[] args)
{
int[] test1 = new int[3] { 1, 2, 3 };
int[] test2 = new int[3] ;
test2 = test1;
test2[2] = 20;
Console.WriteLine("test1[2]=" + test1[2]);
test1[0] = 10;
Console.WriteLine("test2[0]=" + test2[0]);
}
درمثال بالا ابتدا دو متغیر از نوع آرایه در سی شارپ با نام های test1 و test2 تعریف می شود. سپس با عملگر انتساب متغیر test1 را به متغیر test2 انتساب می دهیم. در مرحله بعد ایتم دخیره شده در مکان با اندیس 2 در متغیر test2 را تغییر می دهیم و سپس مقدار ایتم در اندیس 2 در متغیر test1 را چاپ می کنیم آنچه اتفاق می افتد این است که، مقدار ایتم 2 در متغیر test1 نیز تغییر کرده است ( با وجود اینکه ما تغییری در آن ایجاد نکرده ایم ) زیرا هر دو متغیر test1 و test2 به یک مکان از حافظه اشاره می کنند. و هین طور به صورت بالعکس تغییر در مقادیر ایتم های متغیر test1 نیز باعث تغییر در مقدار ایتم های متغیر test2 خواهد شد. خروجی قطعه کد بالا به صورت زیر خواهد بود :
test2[0]=10
برای کپی کردن مقادیر آرایه به متغیر آرایه دیگر کاری که باید به جای انتساب متغیر آرایه در سی شارپ ، انجام بدهیم این است که مقادیر آرایه در سی شارپ را در متغیر آرایه جدید کپی کرد .در این حالت دو متغیر ارایه مستقل داریم که به دو مکان متفاوت در حافظه اشاره می کنند و اگرچه داراری مقادیر یکسانی هستند اما تغییر در یکی تاثیری بر دیگری ندارد.
مثال : کپی کردن مقدار یک آرایه در سی شارپ در اریه جدید.
class Program
{
static void Main(string[] args)
{
int[] test1 = new int[3] { 1, 2, 3 };
int[] test2 = new int[3] ;
for (int i=0; i< test1.Length;i++)
{
test2[i] = test1[i];
}
for (int i = 0; i < test1.Length; i++)
{
Console.Write("test1["+i+"]= " + test1[i]+ " ");
}
Console.WriteLine();
for (int i = 0; i < test1.Length; i++)
{
Console.Write("test2[" + i + "]= " + test2[i]+" ");
}
test2[1] = 20;
test1[1] = 50;
Console.WriteLine("\n new values :\n ");
for (int i = 0; i < test1.Length; i++)
{
Console.Write("test1[" + i + "]= " + test1[i] + " ");
}
Console.WriteLine();
for (int i = 0; i < test1.Length; i++)
{
Console.Write("test2[" + i + "]= " + test2[i] + " ");
}
}
}
در مثال بالا در حلقه for با انتساب مقادیر ایتم های متغیر test1 ، چون این مقادیر از نوع int هستند و نوع int همان طور که در مقاله قبلی به ان اشاره شد زیر مجموعه نوع مقدار ( value type ) است، در نتیجه این انتساب یک کپی از مقادیر ایتم های متغیر ارایه test1 ، در ایتم های ارایه test2 ایجاد می شود. حالا متغیر test2 متغیر ارایه ای است که به مکان دیگری در حافظه اشاره می کند که در ان مقادیر ایتم ها برابر مقادیر ایتم ها در متغیر ارایه test1 است در مرحله بعد با تغییر در مقادیر ایتم های هر ارایه مشاهده می کنیم که بر دیگری تاثیری ندارند و تغییر در یکی باعث تغییر در دیگری نمی شود. خروجی قطعه برنامه بالا به صورت زیر خواهد بود :
test2[0]=1 test2[1]=2 test2[2]=3
test1[0]= 1 test1[1]=20 test1[2]=3
test2[0]=1 test2[1]=50 test2[2]=3
کپی کردن مقادیر آرایه در سی شارپ از نوع مرجع
اگر ارایه از نوع مرجع داشته باشیم در این صورت در زمان کپی کردن مقادیر ارایه به صورت ایتم به ایتم، هر ایتم چون خودش ادرس یک مکان در حافظه است در واقع ادرس ها است که در ایتم های متغیر جدید کپی می شود. با یک مثال سعی می کنم این مساله را روشن تر بیان کنم.
مثال : کپی دو آرایه در سی شارپ از نوع کلاسی با نام person
namespace arrayStatment
{
public class person
{
public string name { get; set; }
public string identityNumber { get; set; }
}
class Program
{
static void Main(string[] args)
{
person[] persons = new person[3];
for (int i = 0; i < persons.Length; i++)
{
persons[i] = new person();
}
persons[0].name="ali";
persons[0].identityNumber = "12345";
persons[1].name = "ahmad";
persons[1].identityNumber = "34567";
persons[2].name = "meysam";
persons[2].identityNumber = "7890";
person[] copyPersons = new person[3];
for (int i=0; i< persons.Length;i++)
{
copyPersons[i] = persons [i];
}
for (int i = 0; i < persons.Length; i++)
{
Console.Write("persons["+i+"]= " + persons[i].name + " " + persons[i].identityNumber +", " );
}
Console.WriteLine();
for (int i = 0; i < persons.Length; i++)
{
Console.Write("copyPersons[" + i + "]= " + copyPersons[i].name + " " + copyPersons[i].identityNumber + ", ");
}
copyPersons[0].name = " new name";
Console.WriteLine("\n\n new values :\n ");
for (int i = 0; i < persons.Length; i++)
{
Console.Write("persons[" + i + "]= " + persons[i].name + " " + persons[i].identityNumber + ", ");
}
Console.WriteLine();
for (int i = 0; i < persons.Length; i++)
{
Console.Write("copyPersons[" + i + "]= " + copyPersons[i].name + " " + copyPersons[i].identityNumber + ", ");
}
}
}
}
با اجرای قطعه کد بالا متوجه می شویم که از ان جا که نوع کلاس از نوع مرجع است، زمانیکه با حلقه for هر ایتم از متغیر ارایه persons را به متغیر ارایه copyPerson انتساب می دهیم هر دو ایتم حاوی ادرس هاای به یک مکان از حافظه می شوند در نتیجه تغییر در یکی باعث تغییر در دیگری می شود .
خروجی به صورت زیر خواهد بود :
copyPersons [0]= ali 12345 , copyPersons [1]= ahmad 34567, copyPersons [1]= meysam 7890
persons[0]= new name 12345 , persons[1]= ahmad 34567, persons[1]= meysam 7890
copyPersons [0]= new name 12345 , copyPersons [1]= ahmad 34567, copyPersons [1]= meysam 7890
گرداوری : سمانه وزیریان
این فصل در یک نگاه:
آموزش ارسال پیامک، آموزش ارسال پیامک تکی و گروهی ، ارسال پیامک به صورت اختصاصی برای هر مشترک، دریافت پیامک، مشاهده وضعیت…
توضیحات کلی مجموعه: آیا می دونید قیمت نرم افزارهای مدیریت پیامک در حدود 150 هزار تومان است؟ اما توسط این دوره شما میتونید با مبلغ بسیار کمتر یک نرم افزار مدیریت پیامک رو به صورت کاملا حر…این فصل در یک نگاه:
در این فصل که فصل پایانی این دوره می باشد در مورد نحوه ساختن فایل نصبی سریع یا همان quick installer که روش پیشنهاد شده م…
توضیحات کلی مجموعه: پس از بازخوردهای بسیار خوبی که از دوره های آموزش برنامه نویسی سیستم اتوماسیون اداری و آموزش برنامه نویسی سیستم فروش و انبارداری مشاهده کردیم، تصمیم گرفتیم با توجه به درخ…این فصل در یک نگاه:
در این فصل که فصل آخر از مجموعه بزرگ آموزش سیستم اتوماسیون اداری می باشد در ابتدا در مورد اسناد و نامه های خارج از سازما…
دوره صفر تا صد آموزش برنامه نویسی و پیاده سازی سیستم اتوماسیون اداری تحت شبکه. (توصیه می شود دومی مجموعه را حتما ببینید) امروزه اطلاعات یکی از مهمترین و با ارزشترین منابع هر اداره و یا ساز…این فصل در یک نگاه:
توضیح تنظیمات گرافیک و صدا در یونیتی پیاده سازی منو ها …
به نام خدا بازیسازی یک حرفه بسیار جذاب است و تبدیل شدن به یک بازیساز حرفهای آرزوی همه ماست. اینکه بتوانیم دنیای خاصی خلق کنیم و در این دنیا قوانین خود را پیاده کنیم، همیشه ما را به وج…این فصل در یک نگاه:
اجرای سیستم روی سیستم، قرار دادن سیستم روی سرور، تعریف Connetion String، آشنایی با فایل App.config، ساخت رشته اتصال به ص…
مهمترین تکنولوژیهای استفاده شده در این دوره پروژه محور (سیستم فروش کالا و انبارداری) طراحی گرافیکی به روش WPF (Windows Presentaion Foundation) آموزش کامل برنامه نویسی xaml (برای طراحی های …این فصل در یک نگاه:
فصل پنجم…
توضیحات کلی مجموعه: درباره گیت: لذت پیش بردن پروژه های برنامه نویسی خود را با بهترین ورژن کنترل سیستم جهان تجربه کنید کامل ترین دوره ی آموزشی گیت و گیت هاب به همراه مثال های کاربردی گی…